﻿using System;
using StockholmsStad.Web.UI.Class.Interfaces;
using StockholmsStad.Web.UI.UIServiceReference;

namespace StockholmsStad.Web.UI.Class.Model
{
    /// <summary>
    /// MVC Model för inloggning
    /// </summary>
    public class LoginModel : ModelBase, ILoginModel
    {
        private readonly IServiceFacade _facade;

        /// <summary>
        /// Skapar model med tillhörande session 
        /// </summary>
        /// <param name="session"></param>
        /// <param name="facade"></param>
        /// <param name="context"></param>
        public LoginModel(ISession session, IServiceFacade facade, IHttpContextAdapter context)
            : base(session, facade)
        {
            _facade = facade;
            Context = context;
        }

        /// <summary>
        /// Wrappat context
        /// </summary>
        private IHttpContextAdapter Context { get; set; }

        #region ILoginModel Members

        /// <summary>
        /// Knytpunkt för ett pars hela vigselhantering, sätts vid inloggning
        /// </summary>
        public User User
        {
            get
            {
                if (Context.IsAuthenticated())
                {
                    if (SessionUser == null)
                        SessionUser = _facade.GetUser(Context.GetUsername());
                }
                else
                {
                    SessionUser = null;
                }
                return SessionUser;
            }
            set { SessionUser = value; }
        }

        ///<summary>
        /// Returnerar true om användaren redan har gjort en bokning innan inloggning
        ///</summary>
        public bool HasUnconfirmedBooking
        {
            get { return Booking != null && Booking.BookingMadeBeforeLogin; }
        }

        /// <summary>
        /// Logga in med en användare och hämta bokningen för användaren
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public bool Login(string username, string password)
        {
            bool loggedIn = _facade.Login(username, password);
            if (loggedIn)
            {
                User user = _facade.GetUser(username);

                //Kolla om den som loggar in inte är den som finns i Session
                if (SessionUser != null && !SessionUser.Username.Equals(user.Username))
                {
                    //Om dom är olika så rensar vi Session
                    RegistrationTicketId = null;
                }
                
                User = user;

                // Retrieve the booking from the server if the user is logged in and 
                // hasn't made a booking before login.
                if (!HasUnconfirmedBooking)
                {
                    IBookingModel bookingModel = new BookingModel(Session, _facade);
                    bookingModel.UpdateBookingFromServer(user);
                }
            }
            else
            {
                User = null;
            }
            return loggedIn;
        }

        ///<summary>
        /// Hämtar alla historikloggar för användaren.
        ///</summary>
        ///<returns></returns>
        public History[] GetHistoryForCurrentUser()
        {
            var history = _facade.GetHistoryForCurrentUser(User);
            return history;
        }

        ///<summary>
        /// Skickar ett mail till användaren med det befintliga lösenordet
        ///</summary>
        ///<param name="email"></param>
        ///<exception cref="NotImplementedException"></exception>
        public void SendForgottenPassword(string email)
        {
            _facade.SendForgottenPassword(email);
        }

        /// <summary>
        /// Svarar true om användaren är inloggad
        /// </summary>
        public bool IsLoggedIn
        {
            get { return Context.IsAuthenticated(); }
        }

        #endregion

    }
}